package com.quanxiaoha.ai.robot.controller;

import com.quanxiaoha.ai.robot.model.ActorFilmography;
import com.quanxiaoha.ai.robot.model.Book;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.converter.BeanOutputConverter;
import org.springframework.ai.converter.ListOutputConverter;
import org.springframework.ai.converter.MapOutputConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;

/**
 * @author Caius
 * @description
 * @since Created in 2025-09-10
 */
@RestController
@RequestMapping("/v8/ai")
public class StructuredOutputController {

    @Resource
    private ChatClient chatClient;
    @Autowired
    private PromptTemplateController promptTemplateController;

    /**
     * entity 结构化输出
     * @param name
     * @return
     */
    @GetMapping("/actor/films")
    public ActorFilmography generate(@RequestParam(value = "name") String name) {
        return chatClient.prompt()
                .user(u -> u.text("""
                                请为演员 {actor} 生成包含5部代表作的电影作品集,
                                只包含 {actor} 担任主演的电影，不要包含任何解释说明。
                                """)
                        .param("actor", name))
                .call()
                .entity(ActorFilmography.class);
    }

    /**
     * 结构转化 MapOutputConverter
     * @param language
     * @return
     */
    @GetMapping("language-info")
    public Map<String, Object> getLanguageInfo(@RequestParam(value = "language")String language) {
        String userText = """
                请提供关于编程语言 {language} 的结构化信息，包含以下字段："
                name (语言名称), "
                popularity (流行度排名，整数), "
                features (主要特性，字符串数组), "
                releaseYear (首次发布年份). "
                不要包含任何解释说明，直接输出 JSON 格式数据。
                """;

        return chatClient.prompt()
                .user(u -> u.text(userText)
                        .param("language", language))
                .call()
                .entity(new MapOutputConverter());
    }


    /**
     * 结构转化 ListOutputConverter
     * @param country
     * @return
     */
    @GetMapping("city-list")
    public List<String> getCityList(@RequestParam(value = "country")String country) {
        return chatClient.prompt()
                .user(u -> u.text(
                        """
                                列出 {country} 的8个主要城市名称。
                                不要包含任何编号、解释或其他文本，直接输出城市名称列表。
                                """
                ).param("country", country))
                .call()
                .entity(new ListOutputConverter());
    }

    @GetMapping("/book-info")
    public Book getBookInfo(@RequestParam(value = "bookTitle") String bookTitle) {
        BeanOutputConverter<Book> converter = new BeanOutputConverter<>(Book.class);

        String template = """
                请提供关于书籍《{bookTitle}》的详细信息：
                1. 作者姓名
                2. 出版年份
                3. 主要类型（数组）
                4. 书籍描述（不少于50字）
                
                不要包含任何解释说明，直接按指定格式输出。
                {format}
                """;

        PromptTemplate promptTemplate = new PromptTemplate(template);
        Prompt prompt = promptTemplate.create(Map.of("bookTitle", bookTitle, "format", converter.getFormat()));

        String result = chatClient.prompt(prompt)
                .call()
                .content();

        return converter.convert(result);
    }
}
